package cn.iocoder.yudao.module.eval.service.employee;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.eval.controller.admin.employee.vo.*;
import cn.iocoder.yudao.module.eval.dal.dataobject.employee.EvalEmployeeProfileDO;
import cn.iocoder.yudao.module.eval.dal.dataobject.employee.EvalEmployeeWorkHistoryDO;
import cn.iocoder.yudao.module.eval.dal.dataobject.employee.EvalEmployeeTrainingRecordDO;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.Collection;
import java.util.List;

/**
 * 企业员工管理 Service 接口
 *
 * @author 芋道源码
 */
public interface EvalEmployeeService {

    /**
     * 创建员工
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createEmployee(@Valid EvalEmployeeCreateReqVO createReqVO);

    /**
     * 更新员工信息
     *
     * @param updateReqVO 更新信息
     */
    void updateEmployee(@Valid EvalEmployeeUpdateReqVO updateReqVO);

    /**
     * 删除员工
     *
     * @param id 编号
     */
    void deleteEmployee(Long id);

    /**
     * 获得员工详情
     *
     * @param id 编号
     * @return 员工信息
     */
    EvalEmployeeRespVO getEmployee(Long id);

    /**
     * 获得员工列表
     *
     * @param ids 编号
     * @return 员工列表
     */
    List<EvalEmployeeRespVO> getEmployeeList(Collection<Long> ids);

    /**
     * 获得员工分页
     *
     * @param pageReqVO 分页查询
     * @return 员工分页
     */
    PageResult<EvalEmployeeRespVO> getEmployeePage(EvalEmployeePageReqVO pageReqVO);

    /**
     * 导出员工 Excel
     *
     * @param pageReqVO 查询条件
     * @param response 响应
     * @throws IOException IO异常
     */
    void exportEmployeeExcel(EvalEmployeePageReqVO pageReqVO, HttpServletResponse response) throws IOException;

    /**
     * 批量导入员工
     *
     * @param file Excel文件
     * @return 导入结果
     * @throws Exception 异常
     */
    EvalEmployeeImportResultRespVO importEmployeeExcel(MultipartFile file) throws Exception;

    /**
     * 获得导入员工模板
     *
     * @param response 响应
     * @throws IOException IO异常
     */
    void importEmployeeTemplate(HttpServletResponse response) throws IOException;

    /**
     * 搜索员工
     *
     * @param keyword 关键词
     * @param deptId 部门ID
     * @param employeeStatus 员工状态
     * @return 员工列表
     */
    List<EvalEmployeeRespVO> searchEmployees(String keyword, Long deptId, Integer employeeStatus);

    /**
     * 设置考评员资质
     *
     * @param setReqVO 设置信息
     */
    void setEvaluatorQualification(@Valid EvalEvaluatorQualificationSetReqVO setReqVO);

    /**
     * 更新考评员资质
     *
     * @param updateReqVO 更新信息
     */
    void updateEvaluatorQualification(@Valid EvalEvaluatorQualificationUpdateReqVO updateReqVO);

    /**
     * 取消考评员资质
     *
     * @param userId 用户ID
     */
    void cancelEvaluatorQualification(Long userId);

    /**
     * 查询考评员列表
     *
     * @param pageReqVO 分页查询
     * @return 考评员分页
     */
    PageResult<EvalEvaluatorRespVO> getEvaluatorPage(EvalEvaluatorPageReqVO pageReqVO);

    /**
     * 查询考评员工作量
     *
     * @param userId 用户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 工作量信息
     */
    EvalEvaluatorWorkloadRespVO getEvaluatorWorkload(Long userId, String startDate, String endDate);

    /**
     * 设置督导员资质
     *
     * @param setReqVO 设置信息
     */
    void setSupervisorQualification(@Valid EvalSupervisorQualificationSetReqVO setReqVO);

    /**
     * 更新督导员资质
     *
     * @param updateReqVO 更新信息
     */
    void updateSupervisorQualification(@Valid EvalSupervisorQualificationUpdateReqVO updateReqVO);

    /**
     * 取消督导员资质
     *
     * @param userId 用户ID
     */
    void cancelSupervisorQualification(Long userId);

    /**
     * 查询督导员列表
     *
     * @param pageReqVO 分页查询
     * @return 督导员分页
     */
    PageResult<EvalSupervisorRespVO> getSupervisorPage(EvalSupervisorPageReqVO pageReqVO);

    /**
     * 添加工作经历
     *
     * @param saveReqVO 保存信息
     * @return 编号
     */
    Long addWorkHistory(@Valid EvalEmployeeWorkHistorySaveReqVO saveReqVO);

    /**
     * 更新工作经历
     *
     * @param updateReqVO 更新信息
     */
    void updateWorkHistory(@Valid EvalEmployeeWorkHistorySaveReqVO updateReqVO);

    /**
     * 删除工作经历
     *
     * @param historyId 经历ID
     */
    void deleteWorkHistory(Long historyId);

    /**
     * 获取员工工作经历
     *
     * @param userId 用户ID
     * @return 工作经历列表
     */
    List<EvalEmployeeWorkHistoryDO> getWorkHistoryByUser(Long userId);

    /**
     * 添加培训记录
     *
     * @param saveReqVO 保存信息
     * @return 编号
     */
    Long addTrainingRecord(@Valid EvalEmployeeTrainingRecordSaveReqVO saveReqVO);

    /**
     * 更新培训记录
     *
     * @param updateReqVO 更新信息
     */
    void updateTrainingRecord(@Valid EvalEmployeeTrainingRecordSaveReqVO updateReqVO);

    /**
     * 删除培训记录
     *
     * @param trainingId 培训ID
     */
    void deleteTrainingRecord(Long trainingId);

    /**
     * 获取培训记录分页
     *
     * @param pageReqVO 分页查询
     * @return 培训记录分页
     */
    PageResult<EvalEmployeeTrainingRecordDO> getTrainingRecordPage(EvalEmployeeTrainingRecordPageReqVO pageReqVO);

    /**
     * 员工概况统计
     *
     * @return 统计信息
     */
    EvalEmployeeStatisticsRespVO getEmployeeStatistics();

    /**
     * 部门员工分布统计
     *
     * @return 统计信息
     */
    List<EvalEmployeeDepartmentStatisticsRespVO> getDepartmentStatistics();

    /**
     * 学历分布统计
     *
     * @return 统计信息
     */
    List<EvalEmployeeEducationStatisticsRespVO> getEducationStatistics();

}
